package com.kfm.pm;

public class MyQueue extends Queue {

    private Object[] arr = null; // 存储数据的容器
    //    arr[0]
//    arr[1]
    private int count = 0; // 每次存储的元素的位置

    private int capacity;

    public MyQueue() {
        capacity = 10;
        arr = new Object[capacity];
    }

    /**
     * 将元素插入队尾
     *
     * @param element 要插入的元素
     */
    @Override
    void enqueue(Object element) {
        grow();
        arr[count] = element;
        count++;
    }

    /**
     * 对arr进行扩容
     */
    private void grow() {
        if (count >= arr.length) {
            Object[] newArr = new Object[(int) Math.ceil(capacity * 1.5)];
            // 将原来的arr的内容赋值到newArr中
            System.arraycopy(arr, 0, newArr, 0, arr.length);
            arr = newArr;
        }
    }

    /**
     * 移除并返回队首元素
     * 删除第一个元素，并返回
     *
     * @return 队首元素, 如果队列为空时，返回 null
     */
    @Override
    Object dequeue() {
        if (isEmpty()) {
            return null;
        }
        Object object = arr[0];
        // 1, 2, 3, 4, 5
        // 2, 3, 4, 5 null
        System.arraycopy(arr, 1, arr, 0, arr.length - 1);
        count--;
        return object;
    }

    /**
     * 返回队首元素，但不移除
     *
     * @return 队首元素
     */
    @Override
    Object peek() {
        if (isEmpty()) {
            return null;
        }
        return arr[0];
    }

    @Override
    boolean isEmpty() {
        return count == 0;
    }

    @Override
    int size() {
        return count;
    }
}
